home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / Barfly1_24.lha / Barfly / Source / Demo.S < prev    next >
Text File  |  1994-08-21  |  34KB  |  1,870 lines

  1. ;-----------------------------------------------------------------------------
  2. ; FUNCTION:    NONE
  3. ;
  4. ; INPUT:    NONE
  5. ;
  6. ; OUTPUT:    NONE
  7. ;
  8. ; REQUIREMENT:
  9. ;    - V2.x : Because 1.x is a pain
  10. ;    - 020+ : Because I wanted too
  11. ;
  12. ; NOTE:    - There was no point to make this code resident, so the program
  13. ;      variables are in the XDATA to save us from an Allocmem.
  14. ;    - Because the code require a bit of CPU power there was no point
  15. ;      to take the time to make it 68000 compatible.
  16. ;    - I removed the 3.x WB support, cause I was not happy with it.
  17. ;    - On my basic 3.1 A3000 blitting the image to the window take ~50%
  18. ;      of the machine time, the C2P ~20%.Think what you want of this fact.
  19. ;    - All drawing routines are custom but use bltbitmap to display
  20. ;      the result in a window.(With a prior c2p pass is needed)
  21. ;
  22. ;-----------------------------------------------------------------------------
  23. ;    ADDSYM
  24.     MC68020
  25.     OUTPUT    T:DEMO
  26.     BOPT    x+,O+,wo-    ;,OG+
  27.  
  28. ;--------------------------------------
  29.     INCDIR    "includes:"
  30.     INCLUDE "exec/execbase.i"
  31.     INCLUDE "exec/memory.i"
  32.     INCLUDE    "intuition/intuition.i"
  33.     INCLUDE    "all_lvo.i"            ;File auto created with LK FDINCLUDE option
  34.  
  35. ;-----------------------------------------------------------------------------
  36. GSTRING    MACRO                    ;This macro should be SECTION based
  37.     bsr.b    \@
  38.     db    "\1",0
  39.     EVEN
  40. \@    movea.l    (sp)+,\2
  41.     ENDM
  42.  
  43. TRUE    = 1
  44. FALSE    = 0
  45.  
  46.     RSRESET                    ;Program Variable
  47. DEMO_Stack        RS.L    1
  48. DEMO_EBase        RS.L    1
  49. DEMO_DBase        RS.L    1
  50. DEMO_IBase        RS.L    1
  51. DEMO_GBase        RS.L    1
  52. DEMO_Error        RS.L    1
  53. DEMO_Screen        RS.L    1
  54. DEMO_WindowXPos        RS.W    1
  55. DEMO_WindowYPos        RS.W    1
  56. DEMO_PolyWindow        RS.L    1
  57. DEMO_BoxWindow        RS.L    1
  58. DEMO_PixelWindow    RS.L    1
  59. DEMO_FireWindow        RS.L    1
  60. DEMO_RingWindow        RS.L    1
  61. DEMO_WeirdWindow    RS.L    1
  62. DEMO_ZoomWindow        RS.L    1
  63. DEMO_DiscWindow        RS.L    1
  64. DEMO_RND        RS.L    1
  65. DEMO_WBVP        RS.L    1
  66. DEMO_ColorMap        RS.L    1
  67. DEMO_HScroll        RS.L    1
  68. DEMO_HSize        RS.W    1
  69. DEMO_VSize        RS.W    1
  70. DEMO_MouseX        RS.W    1
  71. DEMO_MouseY        RS.W    1
  72. DEMO_Dist        RS.L    1
  73. DEMO_Chunky1        RS.L    1
  74. DEMO_Chunky2        RS.L    1
  75. DEMO_SinTable        RS.L    1
  76. DEMO_Pens        RS.B    16
  77. DEMO_AvailPens        RS.B    16
  78. DEMO_BitMap        RS.B    bm_SIZEOF
  79. DEMO_Maping        RS.B    256
  80. DEMO_Points        RS.W    32*3*2
  81. DEMO_SIZEOF        RS.L    0
  82.  
  83. ;    SECTION    DEMOCode,CODE            ;Read ONLY
  84.  
  85. ;--------------------------------------
  86. DEMO_Startup
  87.     lea    (DEMO_BSS,pc),a4
  88.     ml    a7,(DEMO_Stack,a4)
  89.  
  90.     bsr    DEMO_AllocLib
  91.     beq    DEMO_Exit
  92.  
  93.     mw    (DEMO_EBase,a4,),a0
  94.     mw    (AttnFlags,a0),d0
  95.     btst    #AFB_68020,d0
  96.     beq    DEMO_Exit
  97.  
  98. DEMO_Main
  99.     GSTRING    <Demo Screen>,a0
  100.     bsr    DEMO_AllocScreen
  101.     ml    d0,(DEMO_Screen,a4)
  102.     beq    DEMO_Quit
  103.     movea.l    d0,a0
  104.     mq    #0,d0
  105.     mb    (sc_BarHeight,a0),d0
  106.     add.b    (sc_BarVBorder,a0),d0
  107.     mw    d0,(DEMO_WindowYPos,a4)
  108.  
  109.     GSTRING    <Fire>,a0
  110.     bsr    DEMO_AllocWindow
  111.     ml    d0,(DEMO_FireWindow,a4)
  112.     beq    DEMO_Quit
  113.  
  114.     GSTRING    <Zoom>,a0
  115.     bsr    DEMO_AllocWindow
  116.     ml    d0,(DEMO_ZoomWindow,a4)
  117.     beq    DEMO_Quit
  118.  
  119.     GSTRING    <Poly>,a0
  120.     bsr    DEMO_AllocWindow
  121.     ml    d0,(DEMO_PolyWindow,a4)
  122.     beq    DEMO_Quit
  123.  
  124.     GSTRING    <Box>,a0
  125.     bsr    DEMO_AllocWindow
  126.     ml    d0,(DEMO_BoxWindow,a4)
  127.     beq    DEMO_Quit
  128.  
  129.     GSTRING    <Pixel>,a0
  130.     bsr    DEMO_AllocWindow
  131.     ml    d0,(DEMO_PixelWindow,a4)
  132.     beq    DEMO_Quit
  133.  
  134.     GSTRING    <Disc>,a0
  135.     bsr    DEMO_AllocWindow
  136.     ml    d0,(DEMO_DiscWindow,a4)
  137.     beq    DEMO_Quit
  138.  
  139.     GSTRING    <Weird>,a0
  140.     bsr    DEMO_AllocWindow
  141.     ml    d0,(DEMO_WeirdWindow,a4)
  142.     beq    DEMO_Quit
  143.  
  144.     GSTRING    <Ring>,a0
  145.     bsr    DEMO_AllocWindow
  146.     ml    d0,(DEMO_RingWindow,a4)
  147.     beq    DEMO_Quit
  148.  
  149.     movea.l    (DEMO_Screen,a4),a0
  150.     movea.l    (DEMO_IBase,a4),a6
  151.     jsr    (_LVOScreenToFront,a6)        ;Show screen with all window opened
  152.  
  153. .Loop    pea    .Loop(pc)
  154.     mq    #0,D0
  155.     lea    (DEMO_FireWindow,a4),a0
  156.     bsr    .SetBit
  157.     lea    (DEMO_WeirdWindow,a4),a0
  158.     bsr    .SetBit
  159.     lea    (DEMO_PolyWindow,a4),a0
  160.     bsr    .SetBit
  161.     lea    (DEMO_BoxWindow,a4),a0
  162.     bsr    .SetBit
  163.     lea    (DEMO_PixelWindow,a4),a0
  164.     bsr    .SetBit
  165.     lea    (DEMO_DiscWindow,a4),a0
  166.     bsr    .SetBit
  167.     lea    (DEMO_ZoomWindow,a4),a0
  168.     bsr    .SetBit
  169.     lea    (DEMO_RingWindow,a4),a0
  170.     bsr    .SetBit
  171.     beq    DEMO_Quit
  172.     movea.l    (DEMO_EBase,a4),a6
  173.     jsr    (_LVOWait,a6)            ;Wait on any window left opened
  174.  
  175.     ml    #IDCMP_ACTIVEWINDOW,d2
  176.  
  177.     lea    (DEMO_RingWindow,a4),a0
  178.     bsr    DEMO_GetWindowInput
  179.     cmp.l    d2,d0
  180.     beq    DEMO_Ring
  181.  
  182.     lea    (DEMO_FireWindow,a4),a0
  183.     bsr    DEMO_GetWindowInput
  184.     cmp.l    d2,d0
  185.     beq    DEMO_Fire
  186.  
  187.     lea    (DEMO_WeirdWindow,a4),a0
  188.     bsr    DEMO_GetWindowInput
  189.     cmp.l    d2,d0
  190.     beq    DEMO_Weird
  191.  
  192.     lea    (DEMO_ZoomWindow,a4),a0
  193.     bsr    DEMO_GetWindowInput
  194.     cmp.l    d2,d0
  195.     beq    DEMO_Zoom
  196.  
  197.     lea    (DEMO_PolyWindow,a4),a0
  198.     bsr    DEMO_GetWindowInput
  199.     cmp.l    d2,d0
  200.     beq    DEMO_Poly
  201.  
  202.     lea    (DEMO_BoxWindow,a4),a0
  203.     bsr    DEMO_GetWindowInput
  204.     cmp.l    d2,d0
  205.     beq    DEMO_Box
  206.  
  207.     lea    (DEMO_PixelWindow,a4),a0
  208.     bsr    DEMO_GetWindowInput
  209.     cmp.l    d2,d0
  210.     beq    DEMO_Pixel
  211.  
  212.     lea    (DEMO_DiscWindow,a4),a0
  213.     bsr    DEMO_GetWindowInput
  214.     cmp.l    d2,d0
  215.     beq    DEMO_Disc
  216.  
  217.     rts
  218.  
  219. .SetBit    ml    (a0),d1
  220.     beq.b    .TstBit
  221.     movea.l    d1,a0
  222.     mb    ([wd_UserPort,a0],MP_SIGBIT),d1
  223.     bset    d1,d0
  224. .TstBit    tst.l    d0
  225.     rts
  226.  
  227. DEMO_Quit
  228.     ml    (DEMO_Screen,a4),d0
  229.     beq.b    DEMO_Exit
  230.     movea.l    d0,a0
  231.     movea.l    (DEMO_IBase,a4),a6
  232.     jsr    (_LVOScreenToBack,a6)
  233.     bsr    DEMO_FreeBuffer
  234.     lea    (DEMO_FireWindow,a4),a0
  235.     bsr    DEMO_FreeWindow
  236.     lea    (DEMO_RingWindow,a4),a0
  237.     bsr    DEMO_FreeWindow
  238.     lea    (DEMO_ZoomWindow,a4),a0
  239.     bsr    DEMO_FreeWindow
  240.     lea    (DEMO_WeirdWindow,a4),a0
  241.     bsr    DEMO_FreeWindow
  242.     lea    (DEMO_PolyWindow,a4),a0
  243.     bsr    DEMO_FreeWindow
  244.     lea    (DEMO_BoxWindow,a4),a0
  245.     bsr    DEMO_FreeWindow
  246.     lea    (DEMO_PixelWindow,a4),a0
  247.     bsr    DEMO_FreeWindow
  248.     lea    (DEMO_DiscWindow,a4),a0
  249.     bsr    DEMO_FreeWindow
  250.     bsr    DEMO_FreeScreen
  251. DEMO_Exit
  252.     bsr    DEMO_FreeLib
  253.     ml    (DEMO_Stack,a4),a7
  254.     ml    (DEMO_Error,a4),d0
  255.     rts
  256.  
  257. ;--------------------------------------
  258. DEMO_AllocLib
  259.     ml    ($4).w,(DEMO_EBase,a4)
  260.     movea.l    (DEMO_EBase,a4),a6
  261.     lea    (DName,pc),a1
  262.     mq    #0,d0
  263.     jsr    (_LVOOpenLibrary,a6)
  264.     ml    d0,(DEMO_DBase,a4)
  265.     beq.b    .Fail
  266.     lea    (IName,pc),a1
  267.     mq    #37,d0
  268.     jsr    (_LVOOpenLibrary,a6)
  269.     ml    d0,(DEMO_IBase,a4)
  270.     beq.b    .Fail
  271.     lea    (GName,pc),a1
  272.     mq    #37,d0
  273.     jsr    (_LVOOpenLibrary,a6)
  274.     ml    d0,(DEMO_GBase,a4)
  275.     beq.b    .Fail
  276. .Exit    mq    #TRUE,d0
  277.     rts
  278. .Fail    mq    #FALSE,d0
  279.     rts
  280.  
  281. DEMO_FreeLib
  282.     lea    (DEMO_IBase,a4),a0
  283.     bsr.b    .Close
  284.     lea    (DEMO_GBase,a4),a0
  285.     bsr.b    .Close
  286.     lea    (DEMO_DBase,a4),a0
  287. .Close    ml    (a0),d0
  288.     beq.b    .Rts
  289.     clr.l    (a0)
  290.     movea.l    d0,a1
  291.     movea.l    (DEMO_EBase,a4),a6
  292.     jmp    (_LVOCloseLibrary,a6)
  293. .Rts    rts
  294.  
  295. IName        DC.B    "intuition.library",0
  296. GName        DC.B    "graphics.library",0
  297. DName        DC.B    "dos.library",0
  298.     EVEN
  299.  
  300. ;--------------------------------------
  301. DEMO_AllocScreen
  302.     ml    a7,d2
  303.     ml    #-1,-(sp)
  304.     ml    a7,d3
  305.     ml    #TAG_END,-(sp)
  306.     ml    #5,-(sp)
  307.     ml    #SA_Depth,-(sp)
  308.     ml    a0,-(sp)
  309.     ml    #SA_Title,-(sp)
  310.     ml    #CUSTOMSCREEN,-(sp)
  311.     ml    #SA_Type,-(sp)
  312.     ml    #TRUE,-(sp)
  313.     ml    #SA_Behind,-(sp)
  314.     ml    d3,-(sp)
  315.     ml    #SA_Pens,-(sp)
  316.     suba.l    a0,a0
  317.     movea.l    a7,a1
  318.     movea.l    (DEMO_IBase,a4),a6
  319.     jsr    (_LVOOpenScreenTagList,a6)
  320.     ml    d2,a7
  321.     rts
  322.  
  323. DEMO_FreeScreen
  324.     lea    (DEMO_Screen,a4),a0
  325. .Close    ml    (a0),d0
  326.     beq    .Rts
  327.     clr.l    (a0)
  328.     movea.l    d0,a0
  329.     movea.l    (DEMO_IBase,a4),a6
  330.     jmp    (_LVOCloseScreen,a6)
  331. .Rts    rts
  332.  
  333. ;--------------------------------------
  334. DEMO_AllocWindow
  335.     ml    a7,d2
  336.     mq    #0,d0
  337.     ml    #TAG_END,-(sp)
  338.     mw    (DEMO_WindowYPos,a4),d0
  339.     ml    d0,-(sp)
  340.     ml    #WA_Top,-(sp)
  341.     mw    (DEMO_WindowXPos,a4),d0
  342.     ml    d0,-(sp)
  343.     ml    #WA_Left,-(sp)
  344.     ml    #256,-(sp)
  345.     ml    #WA_MaxWidth,-(sp)
  346.     ml    #200,-(sp)
  347.     ml    #WA_MaxHeight,-(sp)
  348.     ml    #32,-(sp)
  349.     ml    #WA_InnerWidth,-(sp)
  350.     ml    #32,-(sp)
  351.     ml    #WA_InnerHeight,-(sp)
  352.     ml    #IDCMP_CLOSEWINDOW!IDCMP_NEWSIZE!IDCMP_ACTIVEWINDOW!IDCMP_INACTIVEWINDOW,-(sp)
  353.     ml    #WA_IDCMP,-(sp)
  354.     ml    #WFLG_SIZEGADGET!WFLG_CLOSEGADGET!WFLG_DRAGBAR!WFLG_DEPTHGADGET,-(sp)
  355.     ml    #WA_Flags,-(sp)
  356.     ml    a0,-(sp)
  357.     ml    #WA_Title,-(sp)
  358.     ml    (DEMO_Screen,a4),-(sp)
  359.     ml    #WA_CustomScreen,-(sp)
  360.     suba.l    a0,a0
  361.     movea.l    a7,a1
  362.     movea.l    (DEMO_IBase,a4),a6
  363.     jsr    (_LVOOpenWindowTagList,a6)
  364.     ml    d2,a7
  365.     tst.l    d0
  366.     beq.b    .Rts
  367.     movea.l    d0,a0
  368.     mw    (wd_Width,a0),d1
  369.     add.w    d1,(DEMO_WindowXPos,a4)
  370.     cmpi.w    #256,(DEMO_WindowXPos,a4)
  371.     ble.b    .Rts
  372.     clr.w    (DEMO_WindowXPos,a4)
  373.     mw    (wd_TopEdge,a0),d1
  374.     add.w    (wd_Height,a0),d1
  375.     mw    d1,(DEMO_WindowYPos,a4)
  376. .Rts    rts
  377.  
  378. DEMO_FreeWindow
  379. .Close    ml    (a0),d0
  380.     beq    .Rts
  381.     clr.l    (a0)
  382.     movea.l    d0,a0
  383.     movea.l    (DEMO_IBase,a4),a6
  384.     jmp    (_LVOCloseWindow,a6)
  385. .Rts    rts
  386.  
  387. ;--------------------------------------
  388. DEMO_GetWindowInput
  389.     ml    (a0),d0
  390.     beq.b    .Rts
  391.     movea.l    d0,a0
  392.     movem.l    d2-d3,-(a7)
  393.     movea.l    (DEMO_EBase,a4),a6
  394.     movea.l    (wd_UserPort,a0),a0
  395.     mq    #0,d2
  396.     jsr    (_LVOGetMsg,a6)
  397.     tst.l    d0
  398.     beq.b    .Done
  399.     movea.l    d0,a1
  400.     ml    (im_Class,a1),d2
  401.     mw    (im_Code,a1),d3
  402.     jsr    (_LVOReplyMsg,a6)
  403. .Done    ml    d2,d0
  404.     mw    d3,d1
  405. .Exit    movem.l    (a7)+,d2-d3
  406. .Rts    rts
  407.  
  408. ;--------------------------------------
  409. DEMO_AllocBuffer
  410.     mw    (DEMO_HSize,a4),d0
  411.     lsr.w    #3,d0
  412.     mw    d0,(DEMO_BitMap+bm_BytesPerRow,a4)
  413.     mw    (DEMO_VSize,a4),(DEMO_BitMap+bm_Rows,a4)
  414.     mb    #4,(DEMO_BitMap+bm_Depth,a4)
  415.     lea    (DEMO_BitMap+bm_Planes,a4),a2
  416.     mq    #4-1,d2
  417.     movea.l    (DEMO_GBase,a4),a6
  418. ..    mw    (DEMO_HSize,a4),d0
  419.     mw    (DEMO_VSize,a4),d1
  420.     jsr    (_LVOAllocRaster,a6)
  421.     ml    d0,(a2)+
  422.     beq.b    .Fail
  423.     dbra    d2,..
  424.  
  425.     mw    (DEMO_HSize,a4),d0
  426.     mulu.w    (DEMO_VSize,a4),d0
  427.     ml    #MEMF_CLEAR,d1
  428.     movea.l    (DEMO_EBase,a4),a6
  429.     jsr    (_LVOAllocMem,a6)
  430.     ml    d0,(DEMO_Chunky1,a4)
  431.     beq.b    .Fail
  432.  
  433.     mw    (DEMO_HSize,a4),d0
  434.     mulu.w    (DEMO_VSize,a4),d0
  435.     ml    #0,d1
  436.     jsr    (_LVOAllocMem,a6)
  437.     ml    d0,(DEMO_Chunky2,a4)
  438.     beq.b    .Fail
  439.  
  440.     mq    #TRUE,d0
  441.     rts
  442. .Fail    mq    #FALSE,d0
  443.     rts
  444.  
  445. .AllocBitMap
  446.     movea.l    (DEMO_GBase,a4),a6
  447.     rts
  448.  
  449. DEMO_FreeBuffer
  450.     lea    (DEMO_BitMap+bm_Planes,a4),a2
  451.     movea.l    (DEMO_GBase,a4),a6
  452.     mq    #4-1,d2
  453. ..    ml    (a2)+,d0
  454.     beq.b    0$
  455.     clr.l    -4(a2)
  456.     movea.l    d0,a0
  457.     mw    (DEMO_HSize,a4),d0
  458.     mw    (DEMO_VSize,a4),d1
  459.     jsr    (_LVOFreeRaster,a6)
  460. 0$    dbra    d2,..
  461.     mw    (DEMO_HSize,a4),d0
  462.     mulu.w    (DEMO_VSize,a4),d0
  463.     lea    (DEMO_Chunky1,a4),a0
  464.     bsr.b    .Free
  465.     mw    (DEMO_HSize,a4),d0
  466.     mulu.w    (DEMO_VSize,a4),d0
  467.     lea    (DEMO_Chunky2,a4),a0
  468. .Free    ml    (a0),d1
  469.     beq.b    .Rts
  470.     clr.l    (a0)
  471.     movea.l    d1,a1
  472.     movea.l    (DEMO_EBase,a4),a6
  473.     jmp    (_LVOFreeMem,a6)
  474. .Rts    rts
  475.  
  476. ;--------------------------------------
  477. DEMO_LoadColor
  478.     adda.w    #16*2,a1
  479.     mq    #8-1,d0
  480. ..    ml    -(a1),-(a7)
  481.     dbra    d0,..
  482.     ml    (DEMO_Screen,a4),a0
  483.     lea    (sc_ViewPort,a0),a0
  484.     movea.l    (vp_ColorMap,a0),a1
  485.     lea    ([cm_ColorTable,a1],16*2),a1
  486.     mq    #8-1,d0
  487. ..    ml    -(a1),-(a7)
  488.     dbra    d0,..
  489.     movea.l    a7,a1
  490.     mq    #32,d0
  491.     movea.l    (DEMO_GBase,a4),a6
  492.     jsr    (_LVOLoadRGB4,a6)
  493.     adda.w    #32*2,a7
  494.     rts
  495.  
  496. ;------------------------------------------------------------------------------
  497. DEMO_Poly
  498.     lea    (PolyColors,pc),a1
  499.     bsr    DEMO_LoadColor
  500.  
  501.     movea.l    (DEMO_PolyWindow,a4),a0
  502.     bsr    DEMO_Resize
  503.  
  504.     ml    #$87654321,(DEMO_RND,a4)
  505.  
  506. .Loop    bsr.b    .Poly
  507.  
  508.     movea.l    (DEMO_PolyWindow,a4),a0
  509.     bsr    DEMO_Display
  510.     lea    (DEMO_PolyWindow,a4),a0
  511.     bsr    DEMO_HandleWindow
  512.     bne.b    .Loop
  513.     rts
  514.  
  515. .Poly    ml    (DEMO_RND,a4),d0
  516.     mq    #0,d1
  517.     lea    (DEMO_Points,a4),a0
  518.     mq    #0,d2
  519.     mq    #0,d3
  520.     mw    (DEMO_HSize,a4),d2
  521.     mw    (DEMO_VSize,a4),d3
  522.     mw    #32*3-1,d4
  523. ..    add.l    d1,d0
  524.     mq    #0,d5
  525.     swap    d0
  526.     add.l    d0,d1
  527.     mw    d0,d5
  528.     mq    #0,d6
  529.     divu.w    d2,d5
  530.     mw    d1,d6
  531.     divu.w    d3,d6
  532.     swap    d6
  533.     mw    d6,d5
  534.     ml    d5,(a0)+
  535.     dbra    d4,..
  536.     ml    d0,(DEMO_RND,a4)
  537.  
  538.     lea    (DEMO_Points,a4),a2
  539.     lea    (DEMO_DrawTriangleDraw,pc),a5
  540.     bsr.b    .Draw
  541.     lea    (DEMO_DrawTriangleErase,pc),a5
  542. .Draw    mq    #16-1,d3
  543. ..    movem.l    (a2)+,d0-d2
  544.     movem.l    d3/a2/a4-a5,-(sp)
  545.     and.w    #%11,d3
  546.     lea    (DEMO_BitMap,a4),a1
  547.     movea.l    (bm_Planes,a1,d3.w*4),a0
  548.     bsr    DEMO_DrawTriangle
  549.     movem.l    (sp)+,d3/a2/a4-a5
  550.     dbra    d3,..
  551.     rts
  552.  
  553. ;------------------------------------------------------------------------------
  554. DEMO_Box
  555.     lea    (BoxColors,pc),a1
  556.     bsr    DEMO_LoadColor
  557.  
  558.     movea.l    (DEMO_BoxWindow,a4),a0
  559.     bsr    DEMO_Resize
  560.  
  561.     ml    #$1,(DEMO_RND,a4)
  562.  
  563. .Loop    bsr.b    .Box
  564.  
  565.     movea.l    (DEMO_BoxWindow,a4),a0
  566.     bsr    DEMO_Display
  567.     lea    (DEMO_BoxWindow,a4),a0
  568.     bsr    DEMO_HandleWindow
  569.     bne.b    .Loop
  570.     rts
  571.  
  572. .Box    ml    (DEMO_RND,a4),d0
  573.     mq    #0,d1
  574.     lea    (DEMO_Points,a4),a0
  575.     mq    #0,d2
  576.     mq    #0,d3
  577.     mw    (DEMO_HSize,a4),d2
  578.     mw    (DEMO_VSize,a4),d3
  579.     mq    #32-1,d4
  580. ..    add.l    d1,d0
  581.     swap    d0
  582.     add.l    d0,d1
  583.     mq    #0,d5
  584.     mw    d0,d5
  585.     divu.w    d2,d5
  586.     mq    #0,d7
  587.     mw    d1,d7
  588.     divu.w    d3,d7
  589.     swap    d7
  590.     mw    d7,d5
  591.     add.l    d1,d0
  592.     swap    d0
  593.     add.l    d0,d1
  594.     mq    #0,d6
  595.     mw    d0,d6
  596.     divu.w    d2,d6
  597.     mq    #0,d7
  598.     mw    d1,d7
  599.     divu.w    d3,d7
  600.     swap    d7
  601.     mw    d7,d6
  602.     cmp.l    d5,d6
  603.     bge.b    0$
  604.     exg.l    d5,d6
  605. 0$    cmp.w    d5,d6
  606.     bge.b    1$
  607.     eor.w    d5,d6
  608.     eor.w    d6,d5
  609.     eor.w    d5,d6
  610. 1$    ml    d5,(a0)+
  611.     ml    d6,(a0)+
  612.     dbra    d4,..
  613.     ml    d0,(DEMO_RND,a4)
  614.  
  615.     lea    (DEMO_Points,a4),a2
  616.     lea    (DEMO_DrawBox,pc),a5
  617.     bsr.b    .Draw
  618.     lea    (DEMO_EraseBox,pc),a5
  619. .Draw    mq    #16-1,d4
  620. ..    movem.w    (a2)+,d0-d3
  621.     movem.l    d4/a2/a4-a5,-(sp)
  622.     and.w    #%11,d4
  623.     lea    (DEMO_BitMap,a4),a1
  624.     movea.l    (bm_Planes,a1,d4.w*4),a0
  625.     jsr    (a5)
  626.     movem.l    (sp)+,d4/a2/a4-a5
  627.     dbra    d4,..
  628.     rts
  629.  
  630. ;------------------------------------------------------------------------------
  631. DEMO_Pixel
  632.     lea    (PixelColors,pc),a1
  633.     bsr    DEMO_LoadColor
  634.  
  635.     movea.l    (DEMO_PixelWindow,a4),a0
  636.     bsr    DEMO_Resize
  637.  
  638.     ml    #$87654321,(DEMO_RND,a4)
  639.  
  640. .Loop    bsr.b    .Pixel
  641.  
  642.     movea.l    (DEMO_PixelWindow,a4),a0
  643.     bsr    DEMO_Display
  644.     lea    (DEMO_PixelWindow,a4),a0
  645.     bsr    DEMO_HandleWindow
  646.     bne.b    .Loop
  647.     rts
  648.  
  649. .Pixel    ml    (DEMO_RND,a4),d0
  650.     mq    #0,d1
  651.     mq    #0,d5
  652.     mw    (DEMO_HSize,a4),d2
  653.     mulu.w    (DEMO_VSize,a4),d2
  654.     movem.l    (DEMO_BitMap+bm_Planes,a4),a0-a3
  655.     mw    #512-1,d4
  656. ..    add.l    d1,d0
  657.     swap    d0
  658.     add.l    d0,d1
  659.     mw    d0,d5
  660.     divu.w    d2,d5
  661.     sub.w    d5,d5
  662.     swap    d5
  663.     mq    #%11,d3
  664.     and.w    d4,d3
  665.     bfchg    (a0){d5:1}
  666.     mw    d1,d5
  667.     divu.w    d2,d5
  668.     sub.w    d5,d5
  669.     swap    d5
  670.     bfchg    (a1){d5:1}
  671.     add.l    d1,d0
  672.     swap    d0
  673.     add.l    d0,d1
  674.     mw    d0,d5
  675.     divu.w    d2,d5
  676.     sub.w    d5,d5
  677.     swap    d5
  678.     mq    #%11,d3
  679.     and.w    d4,d3
  680.     bfchg    (a2){d5:1}
  681.     mw    d1,d5
  682.     divu.w    d2,d5
  683.     sub.w    d5,d5
  684.     swap    d5
  685.     bfchg    (a3){d5:1}
  686.     dbra    d4,..
  687.  
  688.     ml    d0,(DEMO_RND,a4)
  689.     rts
  690.  
  691. ;------------------------------------------------------------------------------
  692. DEMO_Disc
  693.     lea    (DiscColors,pc),a1
  694.     bsr    DEMO_LoadColor
  695.  
  696.     movea.l    (DEMO_DiscWindow,a4),a0
  697.     bsr    DEMO_Resize
  698.  
  699.     ml    #$87654321,(DEMO_RND,a4)
  700.  
  701. .Loop    bsr.b    .Disc
  702.  
  703.     movea.l    (DEMO_DiscWindow,a4),a0
  704.     bsr    DEMO_Display
  705.     lea    (DEMO_DiscWindow,a4),a0
  706.     bsr    DEMO_HandleWindow
  707.     bne.b    .Loop
  708.     rts
  709.  
  710. .Disc    ml    (DEMO_RND,a4),d0
  711.     mq    #0,d1
  712.     lea    (DEMO_Points,a4),a0
  713.     mq    #0,d2
  714.     mq    #0,d3
  715.     mw    (DEMO_HSize,a4),d2
  716.     mw    (DEMO_VSize,a4),d3
  717.     subq.w    #1,d2
  718.     subq.w    #1,d3
  719.     mw    #32-1,d4
  720. ..    add.l    d1,d0
  721.     swap    d0
  722.     add.l    d0,d1
  723.     mq    #0,d5
  724.     mw    d0,d5
  725.     divu.w    d2,d5
  726.     swap    d5
  727.     mw    d5,(a0)+
  728.     mq    #0,d6
  729.     mw    d1,d6
  730.     divu.w    d3,d6
  731.     swap    d6
  732.     mw    d6,(a0)+
  733.  
  734.     add.l    d1,d0
  735.     swap    d0
  736.     add.l    d0,d1
  737.     mq    #0,d7
  738.     mw    d0,d7
  739.     divu.w    d3,d7
  740.     swap    d7
  741.     cmp.w    d7,d5
  742.     bgt.b    0$
  743.     mw    d5,d7
  744. 0$    add.w    d7,d5
  745.     cmp.w    d5,d2
  746.     bgt.b    1$
  747.     sub.w    d7,d5
  748.     mw    d2,d7
  749.     sub.w    d5,d7
  750. 1$    cmp.w    d7,d6
  751.     bgt.b    2$
  752.     mw    d6,d7
  753. 2$    add.w    d7,d6
  754.     cmp.w    d6,d3
  755.     bgt.b    3$
  756.     sub.w    d7,d6
  757.     mw    d3,d7
  758.     sub.w    d6,d7
  759. 3$    mw    d7,(a0)+
  760.  
  761.     dbra    d4,..
  762.     ml    d0,(DEMO_RND,a4)
  763.  
  764.     lea    (DEMO_Points,a4),a2
  765.     lea    (DEMO_DrawDisc,pc),a3
  766.     bsr.b    .Draw
  767.     lea    (DEMO_EraseDisc,pc),a3
  768. .Draw    mq    #16-1,d3
  769. ..    mw    (a2)+,d0
  770.     mw    (a2)+,d1
  771.     mw    (a2)+,d2
  772.     beq.b    .Next2
  773.     movem.l    d3/a2-a4,-(sp)
  774.     and.w    #%11,d3
  775.     lea    (DEMO_BitMap,a4),a1
  776.     movea.l    (bm_Planes,a1,d3.w*4),a0
  777.     mw    (bm_BytesPerRow,a1),d3
  778.     jsr    (a3)
  779.     movem.l    (sp)+,d3/a2-a4
  780. .Next2    dbra    d3,..
  781.     rts
  782.  
  783. ;------------------------------------------------------------------------------
  784. DEMO_Ring
  785.     lea    (RingColors,pc),a1
  786.     bsr    DEMO_LoadColor
  787.  
  788.     movea.l    (DEMO_RingWindow,a4),a0
  789.     bsr    DEMO_Resize
  790.  
  791.     bsr    DEMO_Map2
  792.  
  793. .Loop    movea.l    (DEMO_RingWindow,a4),a0
  794.     mw    (wd_MouseX,a0),(DEMO_MouseX,a4)
  795.     mw    (wd_MouseY,a0),(DEMO_MouseY,a4)
  796.     bsr.b    .Ring
  797.  
  798.     movea.l    (DEMO_RingWindow,a4),a0
  799.     bsr    DEMO_DisplayChunky
  800.     lea    (DEMO_RingWindow,a4),a0
  801.     bsr    DEMO_HandleWindow
  802.     bne.b    .Loop
  803.     rts
  804.  
  805. .Ring    movea.l    (DEMO_Chunky2,a4),a1
  806.     lea    (DEMO_Maping,a4),a0
  807.     mw    (DEMO_VSize,a4),d1
  808.     subq.w    #1,d1
  809.     mw    (DEMO_MouseY,a4),d3
  810.     lsl.w    #3,d3
  811.     mq    #0,d4
  812.     mq    #0,d2
  813. .YLoop    mw    (DEMO_HSize,a4),d0
  814.     subq.w    #1,d0
  815.     mw    d4,d5
  816.     mw    (DEMO_MouseX,a4),d7
  817.     lsl.w    #3,d7
  818. .XLoop    add.w    d7,d5
  819.     subq.w    #8,d7
  820.     mw    d5,d2
  821.     lsr.w    #8,d2
  822.     mb    (a0,d2.w),(a1)+
  823.     dbra    d0,.XLoop
  824.     add.w    d3,d4
  825.     subq.w    #8,d3
  826.     dbra    d1,.YLoop
  827.     rts
  828.  
  829. ;------------------------------------------------------------------------------
  830. DEMO_Zoom
  831.     lea    (ZoomColors,pc),a1
  832.     bsr    DEMO_LoadColor
  833.  
  834.     movea.l    (DEMO_ZoomWindow,a4),a0
  835.     bsr    DEMO_Resize
  836.  
  837.     bsr    DEMO_Map2
  838.  
  839. .Loop    movea.l    (DEMO_ZoomWindow,a4),a0
  840.     mw    (wd_MouseX,a0),(DEMO_MouseX,a4)
  841.     mw    (wd_MouseY,a0),(DEMO_MouseY,a4)
  842.     bsr.b    .Zoom
  843.  
  844.     movea.l    (DEMO_ZoomWindow,a4),a0
  845.     bsr    DEMO_DisplayChunky
  846.     lea    (DEMO_ZoomWindow,a4),a0
  847.     bsr    DEMO_HandleWindow
  848.     bne.b    .Loop
  849.     rts
  850.  
  851. .Zoom    movea.l    (DEMO_Chunky2,a4),a0
  852.     lea    (DEMO_Maping,a4),a1
  853.     add.l    (DEMO_Dist,a4),a2
  854.     add.l    #$1000,(DEMO_Dist,a4)
  855.     mq    #0,d0
  856.     mq    #0,d3
  857.     mq    #0,d4
  858.     mw    (DEMO_VSize,a4),d1
  859.     subq.w    #1,d1
  860. .YLoop    mw    (DEMO_HSize,a4),d0
  861.     subq.w    #1,d0
  862.     ml    d4,d5
  863.     mq    #0,d7
  864. .XLoop    add.l    d7,d5
  865.     add.l    a2,d7
  866.     ml    d5,d2
  867.     sub.w    d2,d2
  868.     rol.l    #8,d2
  869.     mb    (a1,d2.w),(a0)+
  870.     dbra    d0,.XLoop
  871.     add.l    d3,d4
  872.     add.l    a2,d3
  873.     dbra    d1,.YLoop
  874.     rts
  875.  
  876. ;------------------------------------------------------------------------------
  877. DEMO_Weird
  878.     lea    (WeirdColors,pc),a1
  879.     bsr    DEMO_LoadColor
  880.  
  881.     movea.l    (DEMO_WeirdWindow,a4),a0
  882.     bsr    DEMO_Resize
  883.  
  884.     bsr    DEMO_Map2
  885.  
  886. .Loop    movea.l    (DEMO_WeirdWindow,a4),a0
  887.     mw    (wd_MouseX,a0),(DEMO_MouseX,a4)
  888.     mw    (wd_MouseY,a0),(DEMO_MouseY,a4)
  889.     bsr.b    .Weird
  890.  
  891.     movea.l    (DEMO_WeirdWindow,a4),a0
  892.     bsr    DEMO_DisplayChunky
  893.     lea    (DEMO_WeirdWindow,a4),a0
  894.     bsr    DEMO_HandleWindow
  895.     bne.b    .Loop
  896.     rts
  897.  
  898. .Weird    movea.l    (DEMO_Chunky2,a4),a0
  899.     lea    (DEMO_Maping,a4),a1
  900.     ml    #$10000,(DEMO_HScroll,a4)
  901.     mq    #0,d0
  902.     mq    #0,d1
  903.     mq    #0,d2
  904.     mq    #0,d3
  905.     mw    (DEMO_MouseY,a4),d0
  906.     mw    (DEMO_VSize,a4),d2
  907.     subq.w    #1,d2
  908.     ml    d0,d4
  909. .YLoop    swap    d4
  910.     add.l    (DEMO_HScroll,a4),d4
  911.     swap    d4
  912.     ml    d2,d0
  913.     mw    (DEMO_HSize,a4),d1
  914.     subq.w    #1,d1
  915.     lsl.l    #8,d2
  916. .XLoop    mw    d0,d6
  917.     and.w    d2,d6
  918.     lsr.w    #4,d6
  919.     and.w    #$f0,d6
  920.     add.w    d4,d0
  921.     sub.w    d1,d0
  922.     mb    (a1,d6.w),(a0)+
  923.     dbra    d1,.XLoop
  924.     lsr.l    #8,d2
  925.     dbra    d2,.YLoop
  926.     rts
  927.  
  928. ;------------------------------------------------------------------------------
  929. DEMO_Fire
  930.     lea    (FireColors,pc),a1
  931.     bsr    DEMO_LoadColor
  932.  
  933.     movea.l    (DEMO_FireWindow,a4),a0
  934.     bsr    DEMO_Resize
  935.  
  936.     bsr    DEMO_Map1
  937.  
  938.     ml    #$f0f0f0f0,(DEMO_RND,a4)
  939.  
  940. .Loop    bsr.b    .Fire
  941.  
  942.     movea.l    (DEMO_FireWindow,a4),a0
  943.     bsr    DEMO_DisplayChunky
  944.     lea    (DEMO_FireWindow,a4),a0
  945.     bsr    DEMO_HandleWindow
  946.     bne.b    .Loop
  947. .Rts    rts
  948.  
  949. .Fire    mw    (DEMO_VSize,a4),d0
  950.     subq.w    #2,d0
  951.     mulu.w    (DEMO_HSize,a4),d0
  952.     lea    ([DEMO_Chunky1,a4],d0.l),a0
  953.     mw    (DEMO_HSize,a4),d2
  954.     lsr.w    #2,d2
  955.     subq.w    #1,d2
  956.     ml    (DEMO_RND,a4),d0
  957.     mq    #0,d1
  958. ..    add.l    d1,d0
  959.     swap    d0
  960.     add.l    d0,d1
  961.     ml    d0,(a0)+
  962.     dbra    d2,..
  963.     ml    d0,(DEMO_RND,a4)
  964.  
  965.     mw    (DEMO_HSize,a4),d0
  966.     lea    ([DEMO_Chunky1,a4],d0.w),a0
  967.     lea    (a0,d0.w),a1
  968.     lea    (DEMO_Maping,a4),a2
  969.     movea.l    (DEMO_Chunky2,a4),a3
  970.     mw    (DEMO_VSize,a4),d3
  971.     subq.w    #3,d3
  972.     mq    #3,d4
  973.     mq    #0,d0
  974.     mb    (a2),d5
  975. .YLoop    mw    (DEMO_HSize,a4),d2
  976.     subq.w    #1,d2
  977. .XLoop    mb    (a1)+,d0
  978.     add.b    (a0),d0
  979.     roxr.b    #1,d0
  980.     sub.b    d4,d0
  981.     bcs.b    0$
  982.     mb    d0,(a0)+
  983.     mb    (a2,d0.w),(a3)+
  984.     dbra    d2,.XLoop
  985.     dbra    d3,.YLoop
  986.     rts
  987. 0$    mb    d4,(a0)+
  988.     mb    d5,(a3)+
  989.     dbra    d2,.XLoop
  990.     dbra    d3,.YLoop
  991.     rts
  992.  
  993. ;------------------------------------------------------------------------------
  994. DEMO_Map1
  995.     lea    (DEMO_Maping+256,a4),a0
  996.     mw    #(256)-1,d0
  997. ..    mb    d0,d1
  998.     and.b    #$f0,d1
  999.     mb    d1,-(a0)
  1000.     dbra    d0,..
  1001.     rts
  1002.  
  1003. DEMO_Map2
  1004.     lea    (DEMO_Maping+256,a4),a0
  1005.     mw    #(256/2)-1,d0
  1006.     mq    #0,d1
  1007. ..    mb    d1,d2
  1008.     and.b    #$f0,d2
  1009.     mb    d2,-(a0)
  1010.     addq.b    #2,d1
  1011.     dbra    d0,..
  1012.     mw    #(256/2)-1,d0
  1013. ..    subq.b    #2,d1
  1014.     mb    d1,d2
  1015.     and.b    #$f0,d2
  1016.     mb    d2,-(a0)
  1017.     dbra    d0,..
  1018.     rts
  1019.  
  1020. ;------------------------------------------------------------------------------
  1021. DEMO_HandleWindow
  1022.     pea    (a0)
  1023.     movea.l    (DEMO_GBase,a4),a6
  1024.     jsr    (_LVOWaitTOF,a6)
  1025. .Next    movea.l    (sp),a0
  1026.     bsr    DEMO_GetWindowInput
  1027.     movea.l    (sp),a0
  1028.     cmp.l    #IDCMP_INACTIVEWINDOW,d0
  1029.     beq.b    .Fail
  1030.     cmp.l    #IDCMP_NEWSIZE,d0
  1031.     bne.b    .Close
  1032.     movea.l    (a0),a0
  1033.     bsr    DEMO_Resize
  1034.     bra    .True
  1035. .Close    cmp.l    #IDCMP_CLOSEWINDOW,d0
  1036.     bne    .True
  1037.     bsr    DEMO_FreeWindow
  1038. .Fail    movea.l    (sp)+,a0
  1039.     mq    #FALSE,d0
  1040.     rts
  1041. .True    movea.l    (sp)+,a0
  1042.     mq    #TRUE,d0
  1043.     rts
  1044.  
  1045. ;------------------------------------------------------------------------------
  1046. DEMO_Resize
  1047.     pea    (a0)
  1048.     bsr    DEMO_FreeBuffer
  1049.     movea.l    (sp)+,a0
  1050.     mb    (wd_BorderLeft,a0),d0
  1051.     add.b    (wd_BorderRight,a0),d0
  1052.     ext.w    d0
  1053.     neg.w    d0
  1054.     add.w    (wd_Width,a0),d0
  1055.     add.w    #31,d0
  1056.     and.w    #-32,d0
  1057.     mw    d0,(DEMO_HSize,a4)
  1058.     mb    (wd_BorderTop,a0),d0
  1059.     add.b    (wd_BorderBottom,a0),d0
  1060.     ext.w    d0
  1061.     neg.w    d0
  1062.     add.w    (wd_Height,a0),d0
  1063.     mw    d0,(DEMO_VSize,a4)
  1064.     pea    (a0)
  1065.     bsr    DEMO_AllocBuffer
  1066.     movea.l    (sp)+,a0
  1067.     beq    DEMO_Quit
  1068.  
  1069.     mq    #0,d0
  1070.     mq    #0,d1
  1071.     mq    #0,d2
  1072.     mq    #0,d3
  1073.     mb    (wd_BorderLeft,a0),d0
  1074.     mb    (wd_BorderTop,a0),d1
  1075.     mb    (wd_BorderRight,a0),d2
  1076.     mb    (wd_BorderBottom,a0),d3
  1077.     not.w    d2
  1078.     not.w    d3
  1079.     add.w    (wd_Width,a0),d2
  1080.     add.w    (wd_Height,a0),d3
  1081.     movea.l    (wd_RPort,a0),a1
  1082.     mb    (rp_Mask,a1),d4
  1083.     mb    #%10000,(rp_Mask,a1)
  1084.     movea.l    (DEMO_GBase,a4),a6
  1085.     movem.l    d4/a1,-(sp)
  1086.     jsr    (_LVORectFill,a6)
  1087.     movem.l    (sp)+,d4/a1
  1088.     mb    d4,(rp_Mask,a1)
  1089.     rts
  1090.  
  1091. ;------------------------------------------------------------------------------
  1092. DEMO_DisplayChunky
  1093.     movem.l    a0/a4,-(sp)
  1094.     movea.l    (DEMO_Chunky2,a4),a0
  1095.     mw    (DEMO_HSize,a4),d0
  1096.     mulu.w    (DEMO_VSize,a4),d0
  1097.     lea    (a0,d0.l),a5
  1098.     movem.l    (DEMO_BitMap+bm_Planes,a4),a1-a4
  1099.     bsr    C8TOP4
  1100.     movem.l    (sp)+,a0/a4
  1101.  
  1102. DEMO_Display
  1103.     mq    #0,d0
  1104.     mq    #0,d1
  1105.     mq    #0,d2
  1106.     mq    #0,d3
  1107.     mb    (wd_BorderLeft,a0),d2
  1108.     mb    (wd_BorderTop,a0),d3
  1109.     ml    d2,d4
  1110.     mq    #0,d5
  1111.     add.b    (wd_BorderRight,a0),d4
  1112.     neg.w    d4
  1113.     add.w    (wd_Width,a0),d4
  1114.     mw    (DEMO_VSize,a4),d5
  1115.     mw    #$c0,d6
  1116.     movea.l    (wd_RPort,a0),a1
  1117.     lea    (DEMO_BitMap,a4),a0
  1118.     movea.l    (DEMO_GBase,a4),a6
  1119.     jmp    (_LVOBltBitMapRastPort,a6)
  1120.  
  1121. ;------------------------------------------------------------------------------
  1122. ; INPUT:    A0.l = Source chunky buffer START
  1123. ;        A1.l = Pointer to Planes0
  1124. ;        A2.l = Pointer to Planes1
  1125. ;        A3.l = Pointer to Planes2
  1126. ;        A4.l = Pointer to Planes3
  1127. ;        a5.l = Source chunky buffer END
  1128. ;
  1129. ; OUTPUT:    A0.l = Pointer to chunky buffer + 32*4
  1130. ;        A1.l = Pointer to Planes0 + 4
  1131. ;        A2.l = Pointer to Planes1 + 4
  1132. ;        A3.l = Pointer to Planes2 + 4
  1133. ;        A4.l = Pointer to Planes3 + 4
  1134. ;
  1135. C8TOP4
  1136. ..    ml    (a0)+,d4
  1137.     ml    (a0)+,d0
  1138.     lsr.l    #4,d0
  1139.     add.l    d0,d4
  1140.     ml    (a0)+,d5
  1141.     ml    (a0)+,d0
  1142.     lsr.l    #4,d0
  1143.     add.l    d0,d5
  1144.     ml    (a0)+,d6
  1145.     ml    (a0)+,d0
  1146.     lsr.l    #4,d0
  1147.     add.l    d0,d6
  1148.     ml    (a0)+,d7
  1149.     ml    (a0)+,d0
  1150.     lsr.l    #4,d0
  1151.     add.l    d0,d7
  1152.     ml    d4,d0
  1153.     ml    d5,d1
  1154.     swap    d0
  1155.     swap    d1
  1156.     mw    d6,d0
  1157.     mw    d7,d1
  1158.     swap    d6
  1159.     swap    d7
  1160.     mw    d6,d4
  1161.     mw    d7,d5
  1162.     ml    #$00FF00FF,d7
  1163.     ml    d7,d6
  1164.     ml    d7,d2
  1165.     ml    d7,d3
  1166.     and.l    d0,d7
  1167.     and.l    d1,d2
  1168.     and.l    d4,d6
  1169.     and.l    d5,d3
  1170.     sub.l    d7,d0
  1171.     sub.l    d2,d1
  1172.     sub.l    d6,d4
  1173.     sub.l    d3,d5
  1174.     lsl.l    #8,d7
  1175.     lsr.l    #8,d1
  1176.     lsl.l    #8,d6
  1177.     lsr.l    #8,d5
  1178.     add.l    d2,d7
  1179.     add.l    d1,d0
  1180.     add.l    d3,d6
  1181.     add.l    d5,d4
  1182.     ml    #$CCCCCCCC,d5
  1183.     ml    d5,d1
  1184.     ml    d5,d2
  1185.     ml    d5,d3
  1186.     and.l    d4,d5
  1187.     and.l    d0,d1
  1188.     and.l    d6,d2
  1189.     and.l    d7,d3
  1190.     sub.l    d5,d4
  1191.     sub.l    d1,d0
  1192.     sub.l    d2,d6
  1193.     sub.l    d3,d7
  1194.     lsl.l    #2,d4
  1195.     lsr.l    #2,d1
  1196.     lsl.l    #2,d6
  1197.     lsr.l    #2,d3
  1198.     add.l    d0,d4
  1199.     add.l    d1,d5
  1200.     add.l    d7,d6
  1201.     add.l    d3,d2
  1202.     ml    #$AAAAAAAA,d1
  1203.     ml    d1,d3
  1204.     ml    d1,d0
  1205.     ml    d1,d7
  1206.     and.l    d5,d1
  1207.     and.l    d2,d3
  1208.     sub.l    d1,d5
  1209.     sub.l    d3,d2
  1210.     lsr.l    #1,d3
  1211.     add.l    d1,d3
  1212.     ml    d3,(a4)+
  1213.     add.l    d5,d5
  1214.     add.l    d2,d5
  1215.     and.l    d4,d0
  1216.     sub.l    d0,d4
  1217.     ml    d5,(a3)+
  1218.     and.l    d6,d7
  1219.     sub.l    d7,d6
  1220.     lsr.l    #1,d7
  1221.     add.l    d7,d0
  1222.     ml    d0,(a2)+
  1223.     add.l    d4,d4
  1224.     add.l    d4,d6
  1225.     ml    d6,(a1)+
  1226.     cmp.l    a0,a5
  1227.     bne.b    ..
  1228.     rts
  1229.  
  1230. ;------------------------------------------------------------------------------
  1231. ; FUNCTION:    Draw a 1 bitplane triangle
  1232. ;
  1233. ; INPUT:    D0.l = TP Top 2d Point? (x/y)
  1234. ;        D1.l = MP Middle 2d Point? (x/y)
  1235. ;        D2.l = BP Bottom 2d Point? (x/y)
  1236. ;        A0.l = Destination bitplane
  1237. ;        A1.l = bm_ Bitmap
  1238. ;
  1239. DEMO_DrawTriangle:
  1240.     cmp.w    d0,d1
  1241.     bgt.b    0$
  1242.     beq    .Single1            ;Special case: Only 2 slope /\ or \/
  1243.     exg    d0,d1
  1244. 0$    cmp.w    d1,d2
  1245.     bgt.b    .Double
  1246.     beq    .Single2            ;Special case: Only 2 slope /\
  1247.     exg    d1,d2
  1248. 1$    cmp.w    d0,d1
  1249.     bgt.b    .Double
  1250.     beq    .Single3            ;Special case: Only 2 slope \/
  1251.     exg    d0,d1
  1252. .Double    ml    d0,d5                ;d0.l = TP, d1.l = MP, d2.l = BP <\ or />
  1253.     clr.w    d5                ;TPX
  1254.     ml    d1,d7
  1255.     clr.w    d7                ;MPX
  1256.     ml    d2,d6
  1257.     clr.w    d6                ;BPX
  1258.     ml    d5,d3
  1259.     sub.l    d6,d3
  1260.     mw    d0,d4
  1261.     sub.w    d2,d4
  1262.     ext.l    d4
  1263.     divs.l    d4,d3                ;D3.l = Slope TP-BP
  1264.     ml    d7,d4
  1265.     sub.l    d6,d4
  1266.     mw    d1,d6
  1267.     sub.w    d2,d6
  1268.     ext.l    d6
  1269.     divs.l    d6,d4                ;D4.l = Slope MP-BP
  1270.     movea.l    d4,a4
  1271.     ml    d5,d4
  1272.     sub.l    d7,d4
  1273.     mw    d0,d7                ;d7.l = YPos
  1274.     sub.w    d1,d0
  1275.     ext.l    d0
  1276.     divs.l    d0,d4                ;D4.l = Slope TP-MP
  1277.     swap    d6
  1278.     mw    d0,d6
  1279.     ml    d6,d0
  1280.     not.l    d0                ;d0.l:0.l:= (BYSize-1):(TYSize-1)
  1281.     mulu.w    (bm_BytesPerRow,a1),d7
  1282.     adda.l    d7,a0
  1283.     movea.w    (bm_BytesPerRow,a1),a1
  1284.     clr.w    d1
  1285.     mq    #32,d2
  1286.     ml    d3,-(sp)
  1287.     movea.l    d5,a6                ; X2Pos
  1288.     cmp.l    d3,d4
  1289.     bge.b    .D
  1290.     exg    d3,d4
  1291.     movea.l    d4,a2
  1292.     jsr    (a5)
  1293.     ml    d1,d5                ;New X1    (Middle point)
  1294.     swap    d0
  1295.     ml    a4,d3
  1296.     movea.l    (sp)+,a2
  1297.     jmp    (a5)
  1298. .D    movea.l    d4,a2
  1299.     jsr    (a5)
  1300.     movea.l    d1,a6                ;New X2    (Middle point)
  1301.     swap    d0
  1302.     ml    (sp)+,d3
  1303.     movea.l    a4,a2
  1304.     jmp    (a5)
  1305.  
  1306. .Single3
  1307.     ml    d0,d5                ;d0.l = TP, d1.l = MP, d2.l = BP
  1308.     clr.w    d5                ;d5.l = X1Pos
  1309.     ml    d5,d3
  1310.     ml    d2,d6
  1311.     clr.w    d6
  1312.     sub.l    d6,d3
  1313.     mw    d0,d7                ;d7.l = YPos
  1314.     sub.w    d2,d0
  1315.     ext.l    d0
  1316.     divs.l    d0,d3                ;D3.l = Slope TP-BP
  1317.     ml    d1,d0
  1318.     clr.w    d0
  1319.     movea.l    d0,a6                ;d7.l = X2Pos
  1320.     sub.l    d6,d0
  1321.     sub.w    d2,d1
  1322.     ext.l    d1
  1323.     divs.l    d1,d0
  1324.     movea.l    d0,a2                ;A2.l = Slope MP-BP
  1325.     not.w    d1
  1326.     mw    d1,d0
  1327.     mulu.w    (bm_BytesPerRow,a1),d7
  1328.     adda.l    d7,a0
  1329.     movea.w    (bm_BytesPerRow,a1),a1
  1330.     cmpa.l    d5,a6
  1331.     bge.b    .S3
  1332.     exg    d5,a6
  1333.     exg    d3,a2
  1334. .S3    mq    #32,d2
  1335.     jmp    (a5)
  1336. .Exit    rts
  1337.  
  1338. .Single1                    ;d0=d1
  1339.     cmp.w    d0,d2
  1340.     bgt.b    .Single3
  1341.     beq.b    .Exit
  1342.     exg    d0,d2
  1343. .Single2
  1344.     ml    d0,d5                ;d0.l = TP, d1.l = MP, d2.l = BP
  1345.     clr.w    d5                ;d5.l = X1Pos
  1346.     ml    d5,d3
  1347.     ml    d2,d6
  1348.     clr.w    d6
  1349.     sub.l    d6,d3
  1350.     mw    d0,d7
  1351.     sub.w    d2,d7
  1352.     ext.l    d7
  1353.     divs.l    d7,d3                ;D3.l = Slope TP-BP
  1354.     ml    d1,d7
  1355.     clr.w    d7
  1356.     ml    d5,d4
  1357.     sub.l    d7,d4
  1358.     mw    d0,d7                ;d7.l = YPos
  1359.     sub.w    d2,d0
  1360.     ext.l    d0
  1361.     divs.l    d0,d4                ;D4.l = Slope TP-MP
  1362.     movea.l    d5,a6                ;d7.l = X2Pos
  1363.     not.w    d0
  1364.     mulu.w    (bm_BytesPerRow,a1),d7
  1365.     adda.l    d7,a0
  1366.     movea.w    (bm_BytesPerRow,a1),a1
  1367.     cmp.l    d3,d4
  1368.     bge.b    .S1
  1369.     exg    d3,d4
  1370. .S1    movea.l    d4,a2
  1371.     mq    #32,d2
  1372.     jmp    (a5)
  1373.  
  1374. DEMO_DrawTriangleDraw
  1375. .Loop    ml    d5,d6
  1376.     ml    a6,d7
  1377.     clr.w    d6
  1378.     swap    d6
  1379.     swap    d7
  1380.     sub.w    d6,d7
  1381.     ble.b    32$
  1382.     sub.w    d2,d7
  1383.     bgt.b    .Full
  1384.     bfset    (a0){d6:d7}
  1385. 32$    add.l    d3,d5
  1386.     adda.l    a2,a6
  1387.     adda.l    a1,a0
  1388.     dbra    d0,.Loop
  1389.     rts
  1390. .Full    mq    #%11111,d4            ;Get The 32 multiple
  1391.     and.w    d6,d4
  1392.     neg.w    d4
  1393.     bfset    (a0){d6:d4}            ;Left mask
  1394.     lsr.w    #5,d6
  1395.     lea    (4.b,a0,d6.w*4),a3        ;Start pos in plane
  1396.     add.w    d2,d4
  1397.     sub.w    d4,d7                ;Sub to lengh what we just wrote
  1398.     blt.b    .Right
  1399.     mq    #-1,d6
  1400. ..    ml    d6,(a3)+            ;Middle
  1401.     sub.w    d2,d7
  1402.     bge.b    ..
  1403.     add.w    d2,d7
  1404.     beq.b    32$
  1405. .Right    bfset    (a3){0:d7}
  1406.     add.l    d3,d5
  1407.     adda.l    a2,a6
  1408.     adda.l    a1,a0
  1409.     dbra    d0,.Loop
  1410.     rts
  1411.  
  1412. DEMO_DrawTriangleErase
  1413. .Loop    ml    d5,d6
  1414.     ml    a6,d7
  1415.     clr.w    d6
  1416.     swap    d6
  1417.     swap    d7
  1418.     sub.w    d6,d7
  1419.     ble.b    32$
  1420.     sub.w    d2,d7
  1421.     bgt.b    .Full
  1422.     bfclr    (a0){d6:d7}
  1423. 32$    add.l    d3,d5
  1424.     adda.l    a2,a6
  1425.     adda.l    a1,a0
  1426.     dbra    d0,.Loop
  1427.     rts
  1428. .Full    mq    #%11111,d4            ;Get The 32 multiple
  1429.     and.w    d6,d4
  1430.     neg.w    d4
  1431.     bfclr    (a0){d6:d4}            ;Left mask
  1432.     lsr.w    #5,d6
  1433.     lea    (4.b,a0,d6.w*4),a3        ;Start pos in plane
  1434.     add.w    d2,d4
  1435.     sub.w    d4,d7                ;Sub to lengh what we just wrote
  1436.     blt.b    .Right
  1437.     mq    #0,d6
  1438. ..    ml    d6,(a3)+            ;Middle
  1439.     sub.w    d2,d7
  1440.     bge.b    ..
  1441.     add.w    d2,d7
  1442.     beq.b    32$
  1443. .Right    bfclr    (a3){0:d7}
  1444.     add.l    d3,d5
  1445.     adda.l    a2,a6
  1446.     adda.l    a1,a0
  1447.     dbra    d0,.Loop
  1448.     rts
  1449.  
  1450. ;------------------------------------------------------------------------------
  1451. ; FUNCTION:    
  1452. ;
  1453. ; INPUT:    D0.w = XPos
  1454. ;        D1.w = YPos
  1455. ;        D2.w = Radius
  1456. ;        D3.w = XSize
  1457. ;
  1458. ; OUTPUT:    NONE
  1459. ;
  1460. DEMO_DrawDisc:
  1461.     movea.w    d3,a5
  1462.     ext.l    d2
  1463.     mq    #1,d5
  1464.     sub.l    d2,d5                ;d=1-radius
  1465.     movea.l    #3,a6                ;DeltaE=3
  1466.     mq    #-2,d7
  1467.     muls.w    d2,d7
  1468.     addq.l    #5,d7                ;DeltaSE=-2*radius+5
  1469.     movea.l    d7,a4
  1470.     mw    d2,d4
  1471.     mulu.w    d3,d1
  1472.     mulu.w    d3,d4
  1473.     mw    d0,d3
  1474.     swap    d0
  1475.     mw    d3,d0
  1476.     swap    d0    
  1477.     mw    d1,d3                ;D1 = YPos
  1478.     swap    d3
  1479.     mw    d1,d3                ;D3 = YPos/YPos
  1480.     swap    d1
  1481.     mw    d3,d1                ;D1 = YPos/YPos
  1482.     sub.w    d4,d1
  1483.     add.w    d4,d3
  1484.     swap    d1
  1485.     swap    d3
  1486.     sub.w    d2,d0
  1487.     add.w    d2,d2
  1488.     suba.l    a2,a2
  1489. .Loop                        ;d0,d1=XYPos,d2/d3=Radius,D4=Color,d5=D
  1490.     bsr.b    .HLine
  1491.     sub.w    a5,d1
  1492.     add.w    a5,d3
  1493.     cmp.w    a2,d2
  1494.     ble.b    .Done
  1495.     addq.l    #2,a2
  1496.     tst.l    d5
  1497.     bpl.b    .SE
  1498. .E    add.l    a6,d5                ;d=d+deltaE
  1499.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1500.     addq.l    #2,a4                ;DeltaSE=DeltaSE+2
  1501.     sub.l    #$10000,d0            ;XPos
  1502.     add.l    #$20000,d2            ;XSize
  1503.     bra.b    .Loop
  1504. .Done    rts
  1505.  
  1506. .SE    add.l    a4,d5                ;d=d+deltaSE
  1507.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1508.     addq.l    #4,a4                ;DeltaSE=DeltaSE+4
  1509.     addq.w    #1,d0                ;XPos
  1510.     subq.w    #2,d2                ;XSize
  1511.     swap    d0
  1512.     swap    d1
  1513.     swap    d2
  1514.     swap    d3
  1515.     bsr.b    .HLine
  1516.     add.w    a5,d1
  1517.     sub.w    a5,d3
  1518.     subq.w    #1,d0                ;XPos
  1519.     addq.w    #2,d2                ;XSize
  1520.     swap    d0
  1521.     swap    d1
  1522.     swap    d2
  1523.     swap    d3
  1524.     bra.b    .Loop
  1525.  
  1526. .HLine    ml    d0,-(sp)
  1527.     ml    d2,-(sp)
  1528.     add.w    d0,d2
  1529.     lea    (a0,d1.w),a1
  1530.     lea    (a0,d3.w),a3
  1531.     mq    #%11111,d6            ;Get The 32 multiple
  1532.     and.w    d0,d6                ;Mask Left
  1533.     sub.w    d6,d0                ;XSize minus Left Mask
  1534.     mq    #%11111,d7            ;Get The 32 multiple
  1535.     and.w    d2,d7                ;Mask Right
  1536.     sub.w    d7,d2                ;XSize minus Left Mask
  1537.     sub.w    d0,d2                ;Get Copysize
  1538.     ble.b    .Quick                ;(Interchange on triangle type demand)
  1539. .Full    lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1540.     adda.w    d0,a1
  1541.     adda.w    d0,a3
  1542.     mq    #32,d0
  1543.     sub.w    d6,d0
  1544.     bfset    (a1){d6:d0}
  1545.     addq.l    #4,a1
  1546.     lsr.w    #5,d2                ;XSize in Byte Multyple of 32 pix
  1547.     bfset    (a3){d6:d0}
  1548.     addq.l    #4,a3
  1549.     subq.w    #2,d2
  1550.     bmi.b    .Right
  1551.     mq    #-1,d0
  1552. ..9    ml    d0,(a1)+            ;Middle
  1553.     ml    d0,(a3)+            ;Middle
  1554.     dbra    d2,..9
  1555. .Right    mq    #0,d0
  1556.     mq    #0,d6
  1557. .Quick    sub.w    d6,d7
  1558.     beq.b    32$
  1559.     lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1560.     bfset    (a1,d0.w){d6:d7}
  1561.     bfset    (a3,d0.w){d6:d7}
  1562. 32$    ml    (sp)+,d2
  1563.     ml    (sp)+,d0
  1564.     rts
  1565.  
  1566.  
  1567. ;------------------------------------------------------------------------------
  1568. ; FUNCTION:    
  1569. ;
  1570. ; INPUT:    D0.w = XPos
  1571. ;        D1.w = YPos
  1572. ;        D2.w = Radius
  1573. ;        D3.w = XSize
  1574. ;
  1575. ; OUTPUT:    NONE
  1576. ;
  1577. DEMO_EraseDisc:
  1578.     movea.w    d3,a5
  1579.  
  1580.     ext.l    d2
  1581.     mq    #1,d5
  1582.     sub.l    d2,d5                ;d=1-radius
  1583.     movea.l    #3,a6                ;DeltaE=3
  1584.     mq    #-2,d7
  1585.     muls.w    d2,d7
  1586.     addq.l    #5,d7                ;DeltaSE=-2*radius+5
  1587.  
  1588.     movea.l    d7,a4
  1589.     mw    d2,d4
  1590.     mulu.w    d3,d1
  1591.     mulu.w    d3,d4
  1592.  
  1593.     mw    d0,d3
  1594.     swap    d0
  1595.     mw    d3,d0
  1596.     swap    d0    
  1597.  
  1598.     mw    d1,d3                ;D1 = YPos
  1599.     swap    d3
  1600.     mw    d1,d3                ;D3 = YPos/YPos
  1601.     swap    d1
  1602.     mw    d3,d1                ;D1 = YPos/YPos
  1603.     sub.w    d4,d1
  1604.     add.w    d4,d3
  1605.     swap    d1
  1606.     swap    d3
  1607.     sub.w    d2,d0
  1608.     add.w    d2,d2
  1609.     suba.l    a2,a2
  1610. .Loop                        ;d0,d1=XYPos,d2/d3=Radius,D4=Color,d5=D
  1611.     bsr.b    .HLine
  1612.     sub.w    a5,d1
  1613.     add.w    a5,d3
  1614.  
  1615.     cmp.w    a2,d2
  1616.     ble.b    .Done
  1617.     addq.l    #2,a2
  1618.  
  1619.     tst.l    d5
  1620.     bpl.b    .SE
  1621. .E    add.l    a6,d5                ;d=d+deltaE
  1622.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1623.     addq.l    #2,a4                ;DeltaSE=DeltaSE+2
  1624.     sub.l    #$10000,d0            ;XPos
  1625.     add.l    #$20000,d2            ;XSize
  1626.     bra.b    .Loop
  1627. .Done    rts
  1628.  
  1629. .SE    add.l    a4,d5                ;d=d+deltaSE
  1630.     addq.l    #2,a6                ;DeltaE=DeltaE+2
  1631.     addq.l    #4,a4                ;DeltaSE=DeltaSE+4
  1632.     addq.w    #1,d0                ;XPos
  1633.     subq.w    #2,d2                ;XSize
  1634.     swap    d0
  1635.     swap    d1
  1636.     swap    d2
  1637.     swap    d3
  1638.     bsr.b    .HLine
  1639.     add.w    a5,d1
  1640.     sub.w    a5,d3
  1641.     subq.w    #1,d0                ;XPos
  1642.     addq.w    #2,d2                ;XSize
  1643.     swap    d0
  1644.     swap    d1
  1645.     swap    d2
  1646.     swap    d3
  1647.     bra.b    .Loop
  1648.  
  1649. .HLine    ml    d0,-(sp)
  1650.     ml    d2,-(sp)
  1651.     add.w    d0,d2
  1652.     lea    (a0,d1.w),a1
  1653.     lea    (a0,d3.w),a3
  1654.     mq    #%11111,d6            ;Get The 32 multiple
  1655.     and.w    d0,d6                ;Mask Left
  1656.     sub.w    d6,d0                ;XSize minus Left Mask
  1657.     mq    #%11111,d7            ;Get The 32 multiple
  1658.     and.w    d2,d7                ;Mask Right
  1659.     sub.w    d7,d2                ;XSize minus Left Mask
  1660.     sub.w    d0,d2                ;Get Copysize
  1661.     ble.b    .Quick                ;(Interchange on triangle type demand)
  1662. .Full    lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1663.     adda.w    d0,a1
  1664.     adda.w    d0,a3
  1665.     mq    #32,d0
  1666.     sub.w    d6,d0
  1667.     bfclr    (a1){d6:d0}
  1668.     addq.l    #4,a1
  1669.     lsr.w    #5,d2                ;XSize in Byte Multyple of 32 pix
  1670.     bfclr    (a3){d6:d0}
  1671.     addq.l    #4,a3
  1672.     subq.w    #2,d2
  1673.     bmi.b    .Right
  1674.     mq    #0,d0
  1675. ..9    ml    d0,(a1)+            ;Middle
  1676.     ml    d0,(a3)+            ;Middle
  1677.     dbra    d2,..9
  1678. .Right    mq    #0,d0
  1679.     mq    #0,d6
  1680. .Quick    sub.w    d6,d7
  1681.     beq.b    32$
  1682.     lsr.w    #3,d0                ;X1Pos in Byte Multyple of byte
  1683.     bfclr    (a1,d0.w){d6:d7}
  1684.     bfclr    (a3,d0.w){d6:d7}
  1685. 32$    ml    (sp)+,d2
  1686.     ml    (sp)+,d0
  1687.     rts
  1688.  
  1689. ;------------------------------------------------------------------------------
  1690. ; INPUT:    a1 = rp_Bitmap
  1691. ;        d0 = XPos
  1692. ;        d1 = YPos
  1693. ;        d2 = XSize
  1694. ;        d3 = YSize
  1695. ;
  1696. DEMO_DrawBox
  1697.     sub.w    d1,d3
  1698.     subq.w    #1,d3                ;Could test for zero size...
  1699.     bmi.b    .Exit
  1700.     add.w    d0,d2                ;Create x2
  1701.  
  1702.     lea    BMask(pc),a6
  1703.  
  1704.     mq    #%11111,d5
  1705.     and.w    d0,d5                ;Mask Left
  1706.     sub.w    d5,d0
  1707.     lsr.w    #3,d0                ;XPos in Byte Multyple of 32 pixels
  1708.     mq    #%11111,d6
  1709.     and.w    d2,d6                ;Mask Right
  1710.     sub.w    d6,d2                ;XSize minus Left Mask
  1711.     lsr.w    #3,d2
  1712.  
  1713.     mw    (bm_BytesPerRow,a1),d4
  1714.     mulu.w    d4,d1
  1715.     ext.l    d0
  1716.     add.l    d0,d1
  1717.     adda.l    d1,a0
  1718.  
  1719.     sub.w    d0,d2                ;Width of middle copy
  1720.     bne.b    .Full                ;Not Quick
  1721.     ml    (a6,d6.w*4),d1
  1722.     not.l    d1
  1723.     and.l    (a6,d5.w*4),d1
  1724.     movea.l    d4,a5
  1725. ..    or.l    d1,(a0)
  1726.     adda.w    a5,a0
  1727.     dbra    d3,..
  1728. .Exit    rts
  1729. .Full    exg    d4,a5
  1730.     lsr.w    #2,d2
  1731.     ml    (a6,d5.w*4),d1
  1732.     bmi.b    0$
  1733.     movem.l    d3/a0,-(a7)
  1734. ..    or.l    d1,(a0)
  1735.     adda.w    a5,a0
  1736.     dbra    d3,..
  1737.     movem.l    (a7)+,d3/a0
  1738.     subq.w    #1,d2
  1739.     addq.l    #4,a0
  1740. 0$
  1741.     subq.w    #1,d2
  1742.     bmi.b    1$
  1743.     mw    d2,d5
  1744.     addq.l    #1,d5
  1745.     lsl.w    #2,d5
  1746.     movem.l    d3/d5/a0/a5,-(a7)
  1747.     suba.w    d5,a5
  1748.     mq    #-1,d1
  1749. .Loop    mw    d2,d5
  1750. ..    ml    d1,(a0)+
  1751.     dbra    d5,..
  1752.     adda.w    a5,a0
  1753.     dbra    d3,.Loop
  1754.  
  1755.     movem.l    (a7)+,d3/d5/a0/a5
  1756.     adda.w    d5,a0
  1757. 1$    ml    (a6,d6.w*4),d1
  1758.     bmi.b    2$
  1759.     not.l    d1
  1760. ..    or.l    d1,(a0)
  1761.     adda.w    a5,a0
  1762.     dbra    d3,..
  1763. 2$    rts
  1764.  
  1765. ;------------------------------------------------------------------------------
  1766. ; INPUT:    a1 = rp_Bitmap
  1767. ;        d0 = X1
  1768. ;        d1 = Y1
  1769. ;        d2 = X2
  1770. ;        d3 = Y2
  1771. ;
  1772. DEMO_EraseBox
  1773.     sub.w    d1,d3
  1774.     subq.w    #1,d3                ;Could test for zero size...
  1775.     bmi.b    .Exit
  1776.  
  1777.     lea    BMask(pc),a6
  1778.  
  1779.     mq    #%11111,d5
  1780.     and.w    d0,d5                ;Mask Left
  1781.     sub.w    d5,d0
  1782.     lsr.w    #3,d0                ;XPos in Byte Multyple of 32 pixels
  1783.     mq    #%11111,d6
  1784.     and.w    d2,d6                ;Mask Right
  1785.     sub.w    d6,d2                ;XSize minus Left Mask
  1786.     lsr.w    #3,d2
  1787.  
  1788.     mw    (bm_BytesPerRow,a1),d4
  1789.     mulu.w    d4,d1
  1790.     ext.l    d0
  1791.     add.l    d0,d1
  1792.     adda.l    d1,a0
  1793.  
  1794.     sub.w    d0,d2                ;Width of middle copy
  1795.     bne.b    .Full                ;Not Quick
  1796.     ml    (a6,d6.w*4),d0
  1797.     not.l    d0
  1798.     and.l    (a6,d5.w*4),d0
  1799.     not.l    d0
  1800.     movea.l    d4,a5
  1801. ..    and.l    d0,(a0)
  1802.     adda.w    a5,a0
  1803.     dbra    d3,..
  1804. .Exit    rts
  1805. .Full    exg    d4,a5
  1806.     lsr.w    #2,d2
  1807.     ml    (a6,d5.w*4),d1
  1808.     bmi.b    0$
  1809.     movem.l    d3/a0,-(a7)
  1810.     ml    d1,d0
  1811.     not.l    d0
  1812. ..    and.l    d0,(a0)
  1813.     adda.w    a5,a0
  1814.     dbra    d3,..
  1815.     movem.l    (a7)+,d3/a0
  1816.     subq.w    #1,d2
  1817.     addq.l    #4,a0
  1818. 0$
  1819.     subq.w    #1,d2
  1820.     bmi.b    1$
  1821.     mw    d2,d5
  1822.     addq.l    #1,d5
  1823.     lsl.w    #2,d5
  1824.     movem.l    d3/d5/a0/a5,-(a7)
  1825.     suba.w    d5,a5
  1826.     mq    #0,d0
  1827.     mq    #-1,d1
  1828. .Loop    mw    d2,d5
  1829. ..    ml    d0,(a0)+
  1830.     dbra    d5,..
  1831.     adda.w    a5,a0
  1832.     dbra    d3,.Loop
  1833.  
  1834.     movem.l    (a7)+,d3/d5/a0/a5
  1835.     adda.w    d5,a0
  1836. 1$    ml    (a6,d6.w*4),d0
  1837.     bmi.b    2$
  1838. ..    and.l    d0,(a0)
  1839.     adda.w    a5,a0
  1840.     dbra    d3,..
  1841. 2$    rts
  1842.  
  1843. BMask:    dl    $ffffffff,$7fffffff,$3fffffff,$1fffffff,$0fffffff,$07ffffff,$03ffffff,$01ffffff
  1844.     dl    $00ffffff,$007fffff,$003fffff,$001fffff,$000fffff,$0007ffff,$0003ffff,$0001ffff
  1845.     dl    $0000ffff,$00007fff,$00003fff,$00001fff,$00000fff,$000007ff,$000003ff,$000001ff
  1846.     dl    $000000ff,$0000007f,$0000003f,$0000001f,$0000000f,$00000007,$00000003,$00000001
  1847.  
  1848. ;------------------------------------------------------------------------------
  1849. FireColors
  1850.     dw    $000,$100,$200,$300,$400,$500,$600,$700
  1851.     dw    $811,$922,$a33,$b44,$c55,$d66,$e77,$f88
  1852. RingColors
  1853.     dw    $000,$001,$002,$003,$004,$005,$006,$007
  1854.     dw    $118,$229,$33a,$44b,$55c,$66d,$77e,$88f
  1855. WeirdColors
  1856.     dw    $000,$111,$222,$333,$444,$555,$666,$777
  1857.     dw    $887,$996,$aa5,$bb4,$cc3,$dd2,$ee1,$ff0
  1858. ZoomColors
  1859.     dw    $000,$010,$020,$030,$040,$050,$060,$070
  1860.     dw    $181,$292,$3a3,$4b4,$5c5,$6d6,$7e7,$8f8
  1861. DiscColors
  1862. BoxColors
  1863. PolyColors
  1864. PixelColors
  1865.     dw    $000,$800,$080,$880,$008,$808,$088,$888
  1866.     dw    $888,$F88,$8F8,$ff8,$88f,$f8f,$8ff,$fff
  1867.  
  1868. ;    SECTION    RTGData,DATA            ;Read/Write
  1869. DEMO_BSS    dx.b    DEMO_SIZEOF
  1870.